package com.xinnuo.account

import android.accounts.Account
import android.accounts.AccountManager
import android.content.ContentResolver
import android.content.Context
import android.os.Bundle
import androidx.annotation.RequiresPermission


/**
 * 描 述：添加账户和自动同步方法
 *        权限配置：
 *        <!-- 账户同步权限 -->
 *        <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
 *        <uses-permission
 *           android:name="android.permission.GET_ACCOUNTS"
 *           android:maxSdkVersion="22" />
 *        <uses-permission
 *           android:name="android.permission.AUTHENTICATE_ACCOUNTS"
 *           android:maxSdkVersion="22" />
 *
 * 作 者：小卷毛  2021-09-10 14:04
 * 修改描述：
 * 修 改 人：
 * 修改版本：
 */
object AccountHelper {

    /**
     * 添加账户类型，为了保证唯一性，一般采用包名为前缀
     *
     * 在 account_authenticator.xml 标签中的 android:accountType 属性值
     * 在 sync_adapter.xml 标签中的 android:accountType      属性值
     *                             android:contentAuthority 包名作为前缀
     */
    private const val ACCOUNT_TYPE = "com.sbl.thirsty.account"

    /**
     * 添加账户
     */
    @RequiresPermission(android.Manifest.permission.GET_ACCOUNTS)
    fun Context.addAccount(account: String) {
        val accountManager = getSystemService(Context.ACCOUNT_SERVICE) as AccountManager

        // 需要使用 android.permission.GET_ACCOUNTS 权限
        val accounts = accountManager.accounts

        // 该类型账号是否为空
        if (accounts.isEmpty()) {
            try {
                // 添加一个新账户
                accountManager
                    .addAccountExplicitly(
                        // 创建账户
                        Account(account, ACCOUNT_TYPE),
                        "123456",
                        Bundle()
                    )
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

    /**
     * 告知系统开始自动同步
     */
    fun Context.autoSyncStart(account: String) {
        //创建账户
        val mAccount = Account(account, ACCOUNT_TYPE)

        // 设置账户同步开启
        // 注意 : 该操作需要权限 android.permission.WRITE_SYNC_SETTINGS
        ContentResolver.setIsSyncable(
            mAccount,
            "${packageName}.accountSyncProvider",
            1
        )

        // 设置账户自动同步
        ContentResolver.setSyncAutomatically(
            mAccount,
            "${packageName}.accountSyncProvider",
            true
        )

        // 设置账户同步周期
        // 最后一个参数是同步周期 , 这个值只是参考值, 系统并不会严格按照该值执行
        // 一般情况下同步的间隔 10 分钟 ~ 1 小时
        ContentResolver.addPeriodicSync(
            mAccount,
            "${packageName}.accountSyncProvider",
            Bundle(),
            1
        )
    }

}